package tech.aistar.day04.homework;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * 本类用来演示:  T E K V ? ...
 *
 * @author: success
 * @date: 2022/7/22 8:36 上午
 */
public class MyArrayList<E> { //jdk5.x开始提供的泛型,保证集合是类型安全的集合
    private Object[] data;// 真实存储数据的数组,必然会经过扩容操作 - "动态数组"

    private int size;//数组中真实有效的数据

    private static final int DEFAULT_CAPACITY = 10;// 数组的默认容量

    //思考它的作用
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    //构造方法
    public MyArrayList() {
        this.data = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    //添加一个元素
    public void add(E e){
        //业务逻辑
        //确保容量是否是足够的
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        data[size++] = e;  //data[9] = e   ,   size=10
    }

    private void ensureCapacityInternal(int minCapacity) {
        //判断是否是第一次进来.  只有第一次调用add方法才会去执行
        if(this.data == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
            //第一次进入minCapacity肯定是10
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        if(minCapacity>data.length){
            //扩容...
            //希望是1.5倍扩容.
            int oldCapacity = data.length;//first -> 0
            int newCapacity = oldCapacity + (oldCapacity >> 1);  // 0

            //...
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;

            data = Arrays.copyOf(data, newCapacity);
        }
    }

    public void remove(int index){
        // 1 2 3 4 5 6   index = 3
        //1 2 3 5 6
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(data, index+1, data, index,
                    numMoved);
        data[--size] = null;
    }

    @Override
    public String toString(){
        return Arrays.toString(Arrays.copyOf(data,size));
    }

    public static void main(String[] args) {
        //默认的data已经指向了一个长度为0的数组
        MyArrayList<Integer> list = new MyArrayList<>();
        list.add(10);//第一次调用,设置data默认的长度为10
        list.add(20);
        list.add(30);

        list.remove(1);

        //System.out.println(list);

        List<String> lists = new ArrayList<>();
        lists.add("100");
        lists.add("200");
        lists.add("300");

       // System.out.println(lists);

        //Iterator<String> iter = lists.iterator();
        //while(iter.hasNext()){
        //    String n = iter.next();
        //    lists.remove(n);//java.util.ConcurrentModificationException
        //}

        // add remove - mod++

        //jdk5.x增强for循环 - 只读的
        //for (String e : lists) {
        //    lists.remove(e);
        //}

        System.out.println(lists);

    }
}
